#ifndef HOT
#define HOT

#include <iostream>
#include <string>
#include "data.hpp"
#include "config.hpp"
#include <experimental/filesystem>
#include <unistd.h>

extern bucai::DataManager dm;

namespace bucai
{
    namespace fs = std::experimental::filesystem;
    class hotManager
    {
    private:
        std::string _back_dir;
        std::string _pack_dir;
        std::string _arc_suffix;
        std::string _url_prefix;
        time_t _hot_time;

    private:
        bool hotJudge(const std::string &file) // 如果是热点文件返回真，否则返回假
        {
            bucai::fileUtil f(file);
            time_t LastATime = f.LastATime();
            time_t now = time(NULL);
            if (now - LastATime > _hot_time)
            {
                return true;
            }
            return false;
        }

    public:
        hotManager()
        {
            bucai::Config *con = bucai::Config::getConfig();
            _back_dir = con->GetBackDir();
            _pack_dir = con->GetPackDir();
            _arc_suffix = con->GetArcSuffix();
            _url_prefix = con->GetURLPrefix();
            _hot_time = con->GetHotTime();
            bucai::fileUtil f1(_back_dir);
            if (f1.Exists() == false)
            {
                fs::create_directories(_back_dir);
            }

            bucai::fileUtil f2(_pack_dir);
            f2.CreateDirectory();
        }

        bool RunModule()
        {   
            while (1)
            { // 死循环来遍历是否有非热点文件
                sleep(3);//每秒查询一次

                std::vector<std::string> vec;
                bucai::fileUtil file(_pack_dir);
                file.ScanDirectory(&vec);
                for (auto &p : vec)
                { // p是路径
                    if (hotJudge(p) == false)
                    { // 是非热点文件进来处理
                        bucai::fileUtil f(p);
                        std::string zipName = p + _arc_suffix;
                        f.Compress(zipName); // 对文件压缩

                        // 压缩后配置文件信息
                        
                        bucai::DataInfo di;
                        if (dm.GetOneByRealPath(p, &di) == false)
                        { // 如果没有配置文件
                            di.NewDataInfo(p);

                            bool istrue = dm.Insert(di.url, di);
                            if(istrue == false){
                                std::cout << "hot dm.Insert is false : 84" << std::endl;
                            }
                        }
                        // 有配置文件
                        di.pack_flag = true; // 设置为已经压缩

                        bool istrue = dm.Update(di.url, di);
                        if(istrue == false){
                            std::cout << "hot dm.Update is false : 92" << std::endl;
                        }
                        // 删除原信息
                        f.Remove();
                        //移动zip文件到_back_dir 目录中
                        bucai::fileUtil z(zipName);
                        std::string desc = _back_dir + z.FileName();
                        fs::rename(zipName, desc);
                    }
                }
            }
            return true;
        }
    };

}

#endif


// bucai::DataManager dm;
// int main(){

//     dm;
//     bucai::hotManager hot;
//     hot.RunModule();
//     return 0;
// }